package cn.itsource.service.impl;

import cn.dev33.satoken.stp.StpUtil;
import cn.itsource.constants.GlobalExceptionCode;
import cn.itsource.pojo.domain.Login;
import cn.itsource.mapper.LoginMapper;
import cn.itsource.pojo.dto.LoginDto;
import cn.itsource.pojo.vo.LoginInfoVo;
import cn.itsource.service.ILoginService;
import cn.itsource.template.WechatTemplate;
import cn.itsource.utils.AssertUtil;
import cn.itsource.utils.NameUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * <p>
 * 登录表 服务实现类
 * </p>
 *
 * @author 飞越人生
 * @since 2023-12-19
 */
@Service
public class LoginServiceImpl extends ServiceImpl<LoginMapper, Login> implements ILoginService {


    @Autowired
    private WechatTemplate wechatTemplate;




    /**
     * 保存Login
     * @param loginDto
     */
    @Override
    public void saveLogin(LoginDto loginDto) {
        Login login = new Login();
        login.setId(loginDto.getId());
        login.setType(loginDto.getType());
        login.setEnabled(true);
        login.setAvatar("");
        login.setAdmin(false);
        login.setNickName(NameUtil.getName());
        login.setOpenId(loginDto.getOpenId());
        login.setName(NameUtil.getName());
        login.setPhone(loginDto.getPhone());
        login.setCreateTime(new Date());
        super.save(login);

    }


    /**
     * 微信登陆
     * @param openIdCode
     */
    @Override
    public LoginInfoVo wechatLogin(String openIdCode) {

        //调用wechatTemplate方法拿到openid
        String openId = wechatTemplate.codeToOpenId(openIdCode);
        //判断这个openid是否为空,如果为空就抛出一个异常
        AssertUtil.isNotEmpty(openId, GlobalExceptionCode.WECHAT_LOGIN_ERROR);
        //将拿到的openid和数据库中的openid做比较
        Login login = super.getOne(new LambdaQueryWrapper<Login>().eq(Login::getOpenId, openId));
        //判断是否为空,为空就抛出异常
        AssertUtil.isNotNull(login,GlobalExceptionCode.WECHAT_LOGIN_ERROR);


        // 会话登录：参数填写要登录的账号id，建议的数据类型：long | int | String， 不可以传入复杂类型，如：User、Admin 等等
        StpUtil.login(login.getId());

        //将密码设值为空这样就不会响应密码
        login.setPassword("");

        //拿到Token值
        String tokenValue = StpUtil.getTokenValue();

        //拿到Token的名称
        String tokenName = StpUtil.getTokenName();

        //将得到的Token值,Token的名称,Login对象返回给前端
        LoginInfoVo loginInfo = new LoginInfoVo();
        loginInfo.setTokenName(tokenName);
        loginInfo.setTokenValue(tokenValue);
        loginInfo.setLogin(login);

        return loginInfo ;
    }
}
